/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package it.dei.unipd.healthservice.servlet;

import it.dei.unipd.healthservice.database.ClienteDatabase;
import it.dei.unipd.healthservice.resource.Cliente;
import it.dei.unipd.healthservice.resource.SendMail;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.mail.Session;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet per la gestione del Cliente
 * 
 * @author Simone Zennaro
 * @version 1.00
 */
public class ClienteServlet extends AbstractDatabaseServlet {

	public static enum Error{NO_ERROR,NO_CONNECTION_DB,ERROR_ACCESS_DB,SERVLET_ERROR,IO_EXCEPTION}
	/**
	 * Crea un nuovo cliente.
	 * 
	 * @param req
	 *            la richiesta ricevuta dal client.
	 * @param res
	 *            la rispota fornita dal server.
	 * 
	 * @throws ServletException
	 *             se ci sono problemi nell'esecuzione della servlet.
	 * @throws IOException
	 *             se ci sono problemi nella comunicazione client-server.
	 */
	public void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {

		// imposta il tipo MIME della risposta
		res.setContentType("text/html");

		// ottiene un flusso di uscita per scrivere la risposta
		PrintWriter out = res.getWriter();
		Error e=Error.NO_ERROR;
		//
		if (req.getParameter("action").equals("create_cliente")) {
			e=createClient(req,res);
		}
		else if(req.getParameter("action").equals("login")){
			e=login(req, res);	
		}
		else if(req.getParameter("action").equals("logout")){
			e=logout(req, res);
		}
		else if(req.getParameter("action").equals("edit")){
			e=editClient(req,res);
		}
		else if(req.getParameter("action").equals("view")){
			e=view(req, res);
		}
		else if(req.getParameter("action").equals("view_edit")){
			e=view(req, res);
		}
		//gestione di eventuali errori
		if(e!=Error.NO_ERROR){
			switch (e) {
			case NO_CONNECTION_DB:
				out.println("Nessuna connessione con il db");
				break;
			case ERROR_ACCESS_DB:
				out.println("Errore nell'accedere al db");
				break;
			case SERVLET_ERROR:
				out.println("Errore nel redirect della pagina");
				break;
			case IO_EXCEPTION:
				out.println("Errore nel IO per il redirect della pagina");
				break;
			default:
				break;
			}
		}
	}
	
	private Error createClient(HttpServletRequest req,HttpServletResponse res){
		if(!req.getParameter("password").equals(req.getParameter("conferma_password"))){
			try {
				res.sendRedirect("create_cliente.jsp?email="+req.getParameter("email")+"&action=edit&error=psw_diff");
				
				return Error.NO_ERROR;
			} catch (IOException e) {
				return Error.IO_EXCEPTION;
				
			
			}
		}
		boolean isPrivato = Boolean.parseBoolean(req.getParameter("isPrivato"));
		String cognome = req.getParameter("cognome");
		String nome = req.getParameter("nome");
		String cf = req.getParameter("cf");
		String pi = req.getParameter("pi");
		String indirizzo = req.getParameter("indirizzo");
		String cap = req.getParameter("cap");
		String citta = req.getParameter("citta");
		String provincia = req.getParameter("provincia");
		String stato = req.getParameter("stato");
		String telefono = req.getParameter("telefono");
		String email = req.getParameter("email");
		String password = req.getParameter("password");
		boolean confermato = false;
		Cliente cliente = new Cliente(isPrivato, cognome, nome, cf, pi,
				indirizzo, cap, citta, provincia, stato, telefono, email,
				password, confermato);

		Connection con = null;

		try {
			con = DS.getConnection();

			new ClienteDatabase(con, cliente).createCliente();
			
			  String to = email; String subject = "conferma registrazione";
			  String message =
			  "Per confermare la registrazione fate click " +
			  "sul seguente link: " +
			  "http://localhost:8080/HealthService-0.1/confirm_registration?email="
			  +email;
			  
			  String user = "healthserviceteam@gmail.com"; String pass = "healthservice123"; SendMail.send(to,subject,
			  message, user, pass);
			  res.getWriter().println("Mail send successfully");
			 
			RequestDispatcher dispatcher = req.getRequestDispatcher("index.jsp");
			dispatcher.forward(req, res); //visualizzo l'homepage
			
		} catch (NullPointerException ex) {
			return Error.NO_CONNECTION_DB;
		} catch (SQLException ex) {
			return Error.ERROR_ACCESS_DB;
		} catch (ServletException e) {
			return Error.SERVLET_ERROR;
		} catch (IOException e) {
			return Error.IO_EXCEPTION;
		}

		return Error.NO_ERROR;
	}
	/**
	 * Registra l'utente nel sito
	 * @param req
	 * @param res
	 * @return risultato dell'operazione
	 */
	private Error login(HttpServletRequest req,HttpServletResponse res){
		String email = req.getParameter("email");
		String password = req.getParameter("password");
		
		Cliente cliente = new Cliente(email,password);
		new CarrelloServlet().createCarrello(req,res);
		Connection con = null;

		

		try {
			con = DS.getConnection();
			//se esiste un cliente con queste credenziali
			if(new ClienteDatabase(con, cliente).existsCliente()){ 
				HttpSession session=req.getSession(); //creo una sezione
				session.setAttribute("email", email);

				res.sendRedirect("index.jsp");//visualizzo l'homepage
			}
			else{
				res.sendRedirect("index.jsp");
			}
		} catch (NullPointerException ex) {
			return Error.NO_CONNECTION_DB;
		} catch (SQLException ex) {
			return Error.ERROR_ACCESS_DB;
		
		} catch (IOException e) {
			return Error.IO_EXCEPTION;
		}

		return Error.NO_ERROR;
	}
	/**
	 * Esegue il logout dell'utente dal Sito
	 * @param req
	 * @param res
	 * @return risultato dell'operazione
	 */
	private Error logout(HttpServletRequest req,HttpServletResponse res){
		
				HttpSession session=req.getSession(); //creo una sezione
				session.setAttribute("email", null);
				
				RequestDispatcher dispatcher = req.getRequestDispatcher("index.jsp");
				try {
					dispatcher.forward(req, res);
				} catch (ServletException e) {
					return Error.SERVLET_ERROR;
				} catch (IOException e) {
					return Error.IO_EXCEPTION;
				} 
		return Error.NO_ERROR;
	}
	/**
	 * Salva le modifiche al cliente nel DB
	 * @param req
	 * @param res
	 * @return risultato dell'operazione
	 */
	private Error editClient(HttpServletRequest req,HttpServletResponse res){
		if(!req.getParameter("password").equals(req.getParameter("conferma_password"))){
			try {
				res.sendRedirect("view_cliente.jsp?email="+req.getParameter("email")+"&action=edit&error=psw_diff");
				
				return Error.NO_ERROR;
			} catch (IOException e) {
				return Error.IO_EXCEPTION;
				
			
			}
		}
		boolean isPrivato = Boolean.parseBoolean(req.getParameter("isPrivato"));
		String cognome = req.getParameter("cognome");
		String nome = req.getParameter("nome");
		String cf = req.getParameter("cf");
		String pi = req.getParameter("pi");
		String indirizzo = req.getParameter("indirizzo");
		String cap = req.getParameter("cap");
		String citta = req.getParameter("citta");
		String provincia = req.getParameter("provincia");
		String stato = req.getParameter("stato");
		String telefono = req.getParameter("telefono");
		String email = req.getParameter("email");
		String password = req.getParameter("password");
		boolean confermato = false;
		Cliente cliente = new Cliente(isPrivato, cognome, nome, cf, pi,
				indirizzo, cap, citta, provincia, stato, telefono, email,
				password, confermato);

		Connection con = null;

		try {
			con = DS.getConnection();
			
			new ClienteDatabase(con, cliente).editCliente();
		

			res.sendRedirect("view_cliente.jsp?email="+email);//visualizzo la pagina dell'utente
			

		} catch (NullPointerException ex) {
			return Error.NO_CONNECTION_DB;
		} catch (SQLException ex) {
			return Error.ERROR_ACCESS_DB;
		
		} catch (IOException e) {
			return Error.IO_EXCEPTION;
		}

		return Error.NO_ERROR;
	}
	/**
	 * Estrai i dettagli di un cliente dal DB e li visualizza
	 * @param req
	 * @param res
	 * @return risultato dell'operazione
	 */
	private Error view(HttpServletRequest req,HttpServletResponse res){
				Connection con = null;
				try {
					con = DS.getConnection();
					HttpSession session=req.getSession(); //recupero la sessione
					String email=(String)session.getAttribute("email");
					if(email!=null){
						Cliente cliente=new Cliente(email);
						
						cliente=new ClienteDatabase(con, cliente).getCliente();
						
						if(req.getParameter("action").equals("view_edit")){
							req.setAttribute("action","edit");
						}
						req.setAttribute("cliente", cliente);
						String address = "/jsp/view_cliente.jsp";
						RequestDispatcher dispatcher = req.getRequestDispatcher(address);
						dispatcher.forward(req, res);
					}
					else{
						res.getWriter().println("Si è verificato un problema nell'accedere ai dati dell'utente!\n Effettuare di nuovo il login e riprovare");
					}
					
					
				} catch (NullPointerException ex) {
					return Error.NO_CONNECTION_DB;
				} catch (SQLException ex) {
					return Error.ERROR_ACCESS_DB;
				
				} catch (IOException e) {
					return Error.IO_EXCEPTION;
				} catch (ServletException e) {
					return Error.SERVLET_ERROR;
				}
		
				return Error.NO_ERROR;	
				
				
				
	}
}
